<!DOCTYPE html>
<html lang="en"><head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1"><!-- Begin Jekyll SEO tag v2.8.0 -->
<title>0094: Hardware I – Monitors | gtkDcoding</title>
<meta name="generator" content="Jekyll v4.3.4" />
<meta property="og:title" content="0094: Hardware I – Monitors" />
<meta name="author" content="Ron Tarrant" />
<meta property="og:locale" content="en_US" />
<meta name="description" content="This GTK Tutorial covers collecting window stats in preparation for saving a configuration file." />
<meta property="og:description" content="This GTK Tutorial covers collecting window stats in preparation for saving a configuration file." />
<link rel="canonical" href="http://localhost:4000/posts/0094-hardware-i-monitors.html" />
<meta property="og:url" content="http://localhost:4000/posts/0094-hardware-i-monitors.html" />
<meta property="og:site_name" content="gtkDcoding" />
<meta property="og:type" content="article" />
<meta property="article:published_time" content="2019-12-17T00:00:00-05:00" />
<meta name="twitter:card" content="summary" />
<meta property="twitter:title" content="0094: Hardware I – Monitors" />
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","author":{"@type":"Person","name":"Ron Tarrant"},"dateModified":"2019-12-17T00:00:00-05:00","datePublished":"2019-12-17T00:00:00-05:00","description":"This GTK Tutorial covers collecting window stats in preparation for saving a configuration file.","headline":"0094: Hardware I – Monitors","mainEntityOfPage":{"@type":"WebPage","@id":"http://localhost:4000/posts/0094-hardware-i-monitors.html"},"url":"http://localhost:4000/posts/0094-hardware-i-monitors.html"}</script>
<!-- End Jekyll SEO tag -->
<link rel="stylesheet" href="../assets/main.css">
  <link rel="stylesheet" href="../css/style.css" /><link type="application/atom+xml" rel="alternate" href="http://localhost:4000/feed.xml" title="gtkDcoding" /></head>
<body><header class="site-header" role="banner">

  <div class="wrapper"><a class="site-title" rel="author" href="../">gtkDcoding</a><nav class="site-nav">
        <input type="checkbox" id="nav-trigger" class="nav-trigger" />
        <label for="nav-trigger">
          <span class="menu-icon">
            <svg viewBox="0 0 18 15" width="18px" height="15px">
              <path d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.032C17.335,0,18,0.665,18,1.484L18,1.484z M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.032C17.335,6.031,18,6.696,18,7.516L18,7.516z M18,13.516C18,14.335,17.335,15,16.516,15H1.484 C0.665,15,0,14.335,0,13.516l0,0c0-0.82,0.665-1.483,1.484-1.483h15.032C17.335,12.031,18,12.695,18,13.516L18,13.516z"/>
            </svg>
          </span>
        </label>

        <div class="trigger"><a class="page-link" href="../about.html">About</a><a class="page-link" href="../index-reverse.html">Posts in Date Order</a><a class="page-link" href="../topics.html">Blog Posts by Topic</a></div>
      </nav></div>
</header>
<main class="page-content" aria-label="Content">
      <div class="wrapper">
        <article class="post h-entry" itemscope itemtype="http://schema.org/BlogPosting">
	<header class="post-header">
		<link rel="stylesheet" href="../css/font_size.css" />
		<link rel="stylesheet" href="../css/figure.css" />
		<link rel="stylesheet" href="../css/topics/hardware.css" />  <!-- sub in the tag/topic -->
		<link rel="stylesheet" href="../css/modal.css" />
		<link rel="stylesheet" href="../css/post.css" />
		<link rel="stylesheet" href="../css/mascot_effects.css" />

		
		
		<p class="post-meta">
		<time class="dt-published" datetime="2019-12-17T00:00:00-05:00" itemprop="datePublished">Tuesday, December 17, 2019
		</time>• by <span itemprop="author" itemscope itemtype="http://schema.org/Person"><span class="p-author h-card" itemprop="name">Ron Tarrant</span></span></p>
	</header>

	<div class="post-content e-content" itemprop="articleBody">
		<div class="skew-line"></div>
		<h1 id="0094-hardware-i--monitors">0094: Hardware I – Monitors</h1>

<p>Knowing the size and position of the application window (Blog Post #90, #91, and #92) becomes more important if your user has more than one monitor. Most will use one as a primary where they do 90% of their work while relegating the other(s) to such tasks as reference materials, etc. I’m sure you know that, but it makes a great preamble to today’s topic.</p>

<p>But before we dig in, let’s go over some…</p>

<h2 id="gtkgdk-hardware-class-objects">GTK/GDK Hardware Class Objects</h2>

<p>The following objects are not really hierarchical. Some contain pointers to the others while still others just stand by themselves. For easiest access to almost all of them, start with a <code class="language-plaintext highlighter-rouge">Display</code> to grab a pointer to the default <code class="language-plaintext highlighter-rouge">Seat</code> or the default <code class="language-plaintext highlighter-rouge">Screen</code>.</p>

<h3 id="seat">Seat</h3>

<p>Back in the day (like, 1960s and ’70s) when computer technicians were first moving away from using punch cards, the interface that caught on was the terminal consisting of a keyboard, a monitor, and (eventually) a pointing device.</p>

<p>That concept lives on in <em>GTK</em> as the <em>GTK</em> <code class="language-plaintext highlighter-rouge">Seat</code>. A <code class="language-plaintext highlighter-rouge">Seat</code> is considered to be any and all hardware available to a single user at a single workstation. In other words, if the user doesn’t have to get up from his seat to physically touch the device, it’s part of his <em>GTK</em> <code class="language-plaintext highlighter-rouge">Seat</code>. That will include a keyboard, one or more monitors, and a pointing device.</p>

<h3 id="display">Display</h3>

<p>A <code class="language-plaintext highlighter-rouge">Display</code> is any and all hardware providing visuals to a single user at a single workstation. What makes it stand out from all the other hardware objects is that the <code class="language-plaintext highlighter-rouge">Display</code> is part of <em>GDK</em>, not <em>GTK</em>. The <code class="language-plaintext highlighter-rouge">Seat</code> is about tracking all user hardware whereas the <code class="language-plaintext highlighter-rouge">Display</code> is about the visuals. You can access the <code class="language-plaintext highlighter-rouge">Seat</code> from the <code class="language-plaintext highlighter-rouge">Display</code> using <code class="language-plaintext highlighter-rouge">getDefaultSeat()</code>, but the <code class="language-plaintext highlighter-rouge">Display</code>’s main purpose is to act as a container for anything the user will be looking at:</p>

<ul>
  <li>the monitor(s),</li>
  <li>the cursor,</li>
  <li>the pointer, and</li>
  <li>the <code class="language-plaintext highlighter-rouge">Screen</code>.</li>
</ul>

<h3 id="screen">Screen</h3>

<div class="inpage-frame">
	<figure class="left">
		<img src="../images/diagrams/024_hardware/seat_display_screen.png" alt="Figure 1: Seat, Display, and Screen" style="width: 327px; height: 390px;" />
		<figcaption>
			Figure 1: Seat, Display, and Screen
		</figcaption>
	</figure>
</div>

<p>So, we’ve got the monitors, the <code class="language-plaintext highlighter-rouge">Display</code> and the <code class="language-plaintext highlighter-rouge">Screen</code>. So… what’s a <code class="language-plaintext highlighter-rouge">Screen</code>? This is the most abstract concept of the three. Where <code class="language-plaintext highlighter-rouge">Seat</code> represents a collection of user hardware and a <code class="language-plaintext highlighter-rouge">Display</code> is a collection of monitors, a <code class="language-plaintext highlighter-rouge">Screen</code> is the visible surface area of all the monitors collectively. So, it’s not the monitors, but the monitor screens all butted together into one single surface.</p>

<h4 id="and-why-do-we-care-about-all-this">And why do we care about all this?</h4>

<p>Sometimes, you need to put a window on a specific monitor… or capture the input from a keyboard or pointing device before it gets processed through other widgets. Or, as I’ve been going on about for the last few blog posts, you might want to do your users a favor and give them predictable sizing and positioning for windows and dialogs as a way to boost productivity.</p>

<p>So, let’s start by…</p>

<h2 id="monitoring-the-monitors">Monitoring the Monitors</h2>

<!-- 0, 1 -->
<!-- first occurrence of application and terminal screen shots on a single page -->
<div class="screenshot-frame">
	<div class="frame-header">
		Results of this example:
	</div>
	<div class="frame-screenshot">
		<figure>
			<img id="img0" src="../images/screenshots/024_hardware/hardware_01.png" alt="Current example output" />		<!-- img# -->
			
			<!-- Modal for screenshot -->
			<div id="modal0" class="modal">																	<!-- modal# -->
				<span class="close0">&times;</span>															<!-- close# -->
				<img class="modal-content" id="img00" />															<!-- img## -->
				<div id="caption"></div>
			</div>
			
			<script>
			// Get the modal
			var modal = document.getElementById("modal0");														// modal#
			
			// Get the image and insert it inside the modal - use its "alt" text as a caption
			var img = document.getElementById("img0");															// img#
			var modalImg = document.getElementById("img00");													// img##
			var captionText = document.getElementById("caption");

			img.onclick = function()
			{
			  modal.style.display = "block";
			  modalImg.src = this.src;
			  captionText.innerHTML = this.alt;
			}
			
			// Get the <span> element that closes the modal
			var span = document.getElementsByClassName("close0")[0];											// close#
			
			// When the user clicks on <span> (x), close the modal
			span.onclick = function()
			{ 
				modal.style.display = "none";
			}
			</script>
			<figcaption>
			Current example output
			</figcaption>
		</figure>
	</div>

	<div class="frame-terminal">
		<figure class="right">
			<img id="img1" src="../images/screenshots/024_hardware/hardware_01_term.png" alt="Current example terminal output" />		<!-- img#, filename -->

			<!-- Modal for terminal shot -->
			<div id="modal1" class="modal">																				<!-- modal# -->
				<span class="close1">&times;</span>																		<!-- close# -->
				<img class="modal-content" id="img11" />																		<!-- img## -->
				<div id="caption"></div>
			</div>
			
			<script>
			// Get the modal
			var modal = document.getElementById("modal1");																	// modal#
			
			// Get the image and insert it inside the modal - use its "alt" text as a caption
			var img = document.getElementById("img1");																		// img#
			var modalImg = document.getElementById("img11");																// img##
			var captionText = document.getElementById("caption");

			img.onclick = function()
			{
			  modal.style.display = "block";
			  modalImg.src = this.src;
			  captionText.innerHTML = this.alt;
			}
			
			// Get the <span> element that closes the modal
			var span = document.getElementsByClassName("close1")[0];														// close#
			
			// When the user clicks on <span> (x), close the modal
			span.onclick = function()
			{ 
				modal.style.display = "none";
			}
			</script>

			<figcaption>
				Current example terminal output (click for enlarged view)
			</figcaption>
		</figure>
	</div>

	<div class="frame-footer">																								<!-- ------------- filename (below) --------- -->
		The code file for this example is available <a href="https://github.com/rontarrant/gtkd_demos/blob/master/024_hardware/hardware_01_number_of_monitors.d" target="_blank">here</a>.
	</div>
</div>
<!-- end of snippet for first (1st) occurrence of application and terminal screen shots on a single page -->

<p>The basic idea here is to ask the <code class="language-plaintext highlighter-rouge">gdk.Display</code> how many monitors it has. This code can appear anywhere you wanna put it, so I picked the top-level window just to keep the demo as brief as possible. We start by adding two definitions to the <code class="language-plaintext highlighter-rouge">TestRigWindow</code> preamble:</p>

<div class="language-d highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Display</span> <span class="n">myDisplay</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">monitors</span><span class="p">;</span>
</code></pre></div></div>

<p>Which means the constructor becomes:</p>

<div class="language-d highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">this</span><span class="p">()</span>
<span class="p">{</span>
	<span class="k">super</span><span class="p">(</span><span class="n">title</span><span class="p">);</span>
		
	<span class="n">myDisplay</span> <span class="p">=</span> <span class="n">Display</span><span class="p">.</span><span class="n">getDefault</span><span class="p">();</span>
	<span class="n">monitors</span> <span class="p">=</span> <span class="n">myDisplay</span><span class="p">.</span><span class="n">getNMonitors</span><span class="p">();</span>
		
	<span class="n">addOnDestroy</span><span class="p">(&amp;</span><span class="n">quitApp</span><span class="p">);</span>

	<span class="n">showAll</span><span class="p">();</span>

<span class="p">}</span> <span class="c1">// this()</span>
</code></pre></div></div>

<p>We grab the default <code class="language-plaintext highlighter-rouge">Display</code>, the one that all <em>GTK</em> applications have right out of the box, and from there, we get the number of monitors. This number is then reported in the <code class="language-plaintext highlighter-rouge">monitorReport()</code> function:</p>

<div class="language-d highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="n">monitorReport</span><span class="p">()</span>
<span class="p">{</span>
	<span class="n">writeln</span><span class="p">(</span><span class="s">"Your set-up has "</span><span class="p">,</span> <span class="n">monitors</span><span class="p">,</span> <span class="s">" monitors"</span><span class="p">);</span>
		
<span class="p">}</span> <span class="c1">// monitorReport()</span>
</code></pre></div></div>

<p>But we’re not stopping here. Next time, we’ll go after a full report on the <code class="language-plaintext highlighter-rouge">Screen</code> and the monitors that make it up. Until then, have a happy coding life.</p>

<div class="blog-nav">
	<div style="float: left;">
		<a href="./0093-window-stats-iii-alt.html">Previous: Window Stats - Alternate Window Stats</a>
	</div>
	<div style="float: right;">
		<a href="./0095-hardware-ii-full-monitor-report.html">Next: Hardware II - Full Monitor Report</a>
	</div>
</div>
<p>
	<h3></h3>
<div class="inpage-frame">
	<a href="https://github.com/sponsors/rontarrant">
		<BR>
		<BR>
		<B>Is this article useful? Educational? Entertaining, perhaps?</B>
		<BR>
		<figure class="left">
			<img src="../images/favorite_32.png" alt="Sponsorship heart" style="width: 32px; height: 32px;">
		</figure>
		You're free to accept or decline this invitation to become our newest sponsor.
	</a>
</div>
	<h4 class="comment-blurb"><B>Comments? Questions? Observations?</B></h4>
	<p>
		Did we miss a tidbit of information that would make this post even more informative? Let's talk about it in the comments.
	</p>
	<script src="https://utteranc.es/client.js"
		repo="rontarrant"
		issue-term="pathname"
		theme="github-light"
		crossorigin="anonymous"
		async>
	</script>
	<ul>
		<li> come on over to the <a href="https://forum.dlang.org/">D Language Forum</a> and look for one of the <i>gtkDcoding</i> announcement posts, </li>
		<li> drop by <a href="https://forum.gtkd.org/">the <i>GtkD Forum</i></a>,</li>
		<li> follow the link below to email me, or</li>
		<li> go to the	<a href="https://www.facebook.com">gtkDcoding Facebook page.</a></li>
	</ul>
</p>
<p> You can also subscribe <a href="/feed.xml">via RSS</a> so you won't miss anything. Thank you very much for dropping by.</p>
<p>&copy; Copyright 2025 Ron Tarrant </p>
</div>

	<a class="u-url" href="./0094-hardware-i-monitors.html" hidden></a>
</article>

      </div>
    </main><footer class="site-footer h-card">
  <data class="u-url" href="/"></data>

  <div class="wrapper">

    <h2 class="footer-heading">gtkDcoding</h2>

    <div class="footer-col-wrapper">
      <div class="footer-col footer-col-1">
        <ul class="contact-list">
          <li class="p-name">Ron Tarrant</li><li><a class="u-email" href="mailto:gtkDcoding@gmail.com">gtkDcoding@gmail.com</a></li></ul>
      </div>

      <div class="footer-col footer-col-2"><ul class="social-media-list"><li><a href="https://github.com/rontarrant"><svg class="svg-icon"><use xlink:href="../assets/minima-social-icons.svg#github"></use></svg> <span class="username">rontarrant</span></a></li></ul>
</div>

      <div class="footer-col footer-col-3">
        <p>Simple examples of how to use GtkD to build GUI applications.</p>
      </div>
    </div>

  </div>

</footer>
</body>

</html>
